#pragma once
#include"google/protobuf/service.h"
#include<muduo/net/TcpServer.h>
#include<muduo/net/EventLoop.h>
#include<muduo/net/InetAddress.h>
#include<muduo/net/TcpConnection.h>
#include"mprpcconfig.h"
#include <string>
#include <functional>
#include <google/protobuf/descriptor.h>
#include<unordered_map>
// 框架提供的专门服务发布的rpc服务网络对象

class RpcProvider
{
public:
    // 这里市框架提供给外部使用的，可以发布rpc方法的函数接口
    void NotifyService(google::protobuf::Service* service);
    // 启动rpc服务节点，开始提供rpc远程调用服务
    void Run();
private:
    // 组合Eventloop
    muduo::net::EventLoop m_eventLoop;
    
    // service服务类型信息
    struct ServiceInfo
    {
        google::protobuf::Service* m_service; // 保存服务对象
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor*> m_methodMap;
    };
    // 存储注册成功的服务对象和服务方法的所有信息
    std::unordered_map<std::string, ServiceInfo> m_serviceMap;

    void OnConnection(const muduo::net::TcpConnectionPtr& conn);
    void OnMessage(const muduo::net::TcpConnectionPtr& conn,
                            muduo::net::Buffer* buffer,
                            muduo::Timestamp receiveTime);

    // Closure的回调操作，用于序列化rpc响应和网络的发送

    void SendRpcResponse(const muduo::net::TcpConnectionPtr& conn,
                        google::protobuf::Message* response);
};
